package co.edu.udea.iw.tusanimes.dao.impl;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import co.edu.udea.iw.tusanimes.dao.CalificacionVideoDao;
import co.edu.udea.iw.tusanimes.dao.exception.DAOException;
import co.edu.udea.iw.tusanimes.dto.CalificacionVideo;
import co.edu.udea.iw.tusanimes.dto.CalificacionVideoId;


/**
 * Implementaci�n de la Interfaz UsuarioDao
 * 
 * @author Johan Torres
 * @version 1.0
 */
public class CalificacionVideoDaoImpl extends HibernateDaoSupport implements CalificacionVideoDao {

	/**
	 * Guardar calificaci�n de un video.
	 * 
	 * @param calificacion
	 *            calificaci�n a guardar.
	 * @return CalificacionVideo calificaci�n guardada.
	 * @throws DAOException
	 */
	@Override
	public CalificacionVideo crearCalificacionVideo(
			CalificacionVideo calificacion) throws DAOException {
		Session session = null;
		Transaction tx = null;

		try {
			session =getSession();
			tx = session.beginTransaction();
			session.save(calificacion);
			tx.commit();
		} catch (HibernateException e) {
			throw new DAOException();
		}

		return calificacion;
	}

	/**
	 * Actualizar calificaci�n.
	 * 
	 * @param calificacion
	 *            Calificaci�n a actualizar.
	 * @throws DAOException
	 */
	@Override
	public void actualizarCalificacionVideo(CalificacionVideo calificacion)
			throws DAOException {
		Session session = null;
		Transaction tx = null;

		try {
			session = getSession();
			tx = session.beginTransaction();
			session.update(calificacion);
			tx.commit();
		} catch (HibernateException e) {
			throw new DAOException();
		}

	}

	/**
	 * Buscar calificaci�n de un video.
	 * 
	 * @param id
	 *            Identificador de la calificaci�n.
	 * @return CalificacionVideo Calificaci�n encontrada.
	 * @throws DAOException
	 */
	@Override
	public CalificacionVideo buscarCalificacionVideo(CalificacionVideoId id)
			throws DAOException {
		Session session = null;
		CalificacionVideo calificacion = null;

		try {
			session = getSession();
			calificacion = (CalificacionVideo) session
					.createCriteria(CalificacionVideo.class)
					.add(Restrictions.eq("id", id)).uniqueResult();
		} catch (HibernateException e) {
			throw new DAOException();
		}

		return calificacion;
	}

	/**
	 * Eliminar calificaci�n.
	 * 
	 * @param id
	 *            Identificador de la calificaci�n.
	 * @throws DAOException
	 */
	@Override
	public void eliminarCalificacionVideo(CalificacionVideoId id)
			throws DAOException {
		Session session = null;
		Transaction tx = null;
		Query query = null;
		String sql;

		try {
			sql = "delete from CalificacionVideo where usuarios_nombreDeUsuario = :nombreDeUsuario "
					+ "and videos_idVideo = :idVideo";
			session = getSession();
			tx = session.beginTransaction();

			session = getSession();
			tx = session.beginTransaction();
			query = session.createQuery(sql);

			query.setString("nombreDeUsuario", id.getNombreDeUsuario());
			query.setInteger("idVideo", id.getIdVideo());
			query.executeUpdate();
			tx.commit();
		} catch (HibernateException e) {
			throw new DAOException();
		}

	}

}
